home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 43
/
Aminet 43 (2001)(GTI - Schatztruhe)[!][Jun 2001].iso
/
Aminet
/
comm
/
tcp
/
daytimedemo.lha
/
daytimedemo
/
daytime.c
< prev
next >
Wrap
C/C++ Source or Header
|
2001-04-08
|
3KB
|
147 lines
/*
* daytime.c
*
* client for tcp daytime service
*
* adapted from "UNIX Network Programming, Vol.1, 2nd Edition" by W. Richard Stevens
* for Amiga® OS with AmiTCP 4.x compatible network stacks
*
* should work with any compiler; link additional startup routine "startup.c" for Maxon C/C++ only
*/
#include <pragma/exec_lib.h>
#include <pragma/dos_lib.h>
#include <pragma/socket_lib.h>
#include <sys/socket.h>
#include <string.h>
#define DAYTIMEPORT 13
#define LOCALHOSTIP "127.0.0.1"
struct Library *SocketBase = NULL;
/* let's design our resource handling "re-usable" */
struct Library *openSockLib(void)
{
return(OpenLibrary(SOCKETNAME, 4U));
}
void closeSockLib(struct Library **base)
{
CloseLibrary(*base);
*base = NULL;
}
LONG main(LONG argc, APTR argv)
{
struct RDArgs *rdargs;
STRPTR tmpl = "H=HOSTIP/K,P=PORT/K/N";
LONG arg[2] = {0L, 0L};
LONG rw = RETURN_OK;
char *hostip = LOCALHOSTIP;
int serviceport = DAYTIMEPORT;
/* Workbench is not supported (this is a learning demo...) */
if(argc)
{
/* convenient Amiga shell-parameter handling */
rdargs = ReadArgs(tmpl, arg, NULL);
if(rdargs)
{
hostip = arg[0] ? (char *) arg[0] : hostip;
serviceport = arg[1] ? *((LONG *) arg[1]) : serviceport;
}
/* open bsdsocket.library */
SocketBase = openSockLib();
if(SocketBase)
{
long sockfd;
/* open TCP access */
sockfd = socket(AF_INET, SOCK_STREAM, 0L);
if(sockfd >= 0L)
{
struct sockaddr_in servaddr;
/* create TCP request */
memset(&servaddr, 0L, sizeof(struct sockaddr_in));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(serviceport);
servaddr.sin_addr.s_addr = inet_addr(hostip); /* sin_addr == s_addr */
if(servaddr.sin_addr.s_addr != (~0))
{
/* connect to service port on host [connect() has an internal CTRL_C handling] */
if(connect(sockfd, (const struct sockaddr *) &servaddr, sizeof(struct sockaddr_in)) >= 0L)
{
char buffer[4];
long rd;
/* receive and print data (small buffer to force multiple recv()'s) */
do
{
/* receive data */
rd = recv(sockfd, buffer, 4, 0);
if(rd)
{
/* buffered write data */
FWrite(Output(), buffer, rd, 1);
/* standard while()-loop emergency break */
if(CheckSignal(SIGBREAKF_CTRL_C))
{
PutStr("^C -- user break\n");
rw = RETURN_WARN;
break;
}
}
}
while(rd > 0);
/* empty buffers (not really required) */
Flush(Output());
}
else
{
Printf("Could not connect to port %ld on \"%s\"\n", serviceport, hostip);
rw = RETURN_ERROR;
}
}
else
{
Printf("Not a valid network address: \"%s\"\n", hostip);
rw = RETURN_ERROR;
}
/* release TCP access */
CloseSocket(sockfd);
}
else
{
Printf("Error code %ld while opening network socket\n", sockfd);
rw = RETURN_FAIL;
}
/* release bsdsocket.library */
closeSockLib(&SocketBase);
}
else
{
Printf( "Error opening \"%s\" version %ld\n"
"You must start AmiTCP 4.x, or a compatible TCP/IP stack\n",
SOCKETNAME, 4L);
rw = RETURN_FAIL;
}
FreeArgs(rdargs);
}
return(rw);
}